package com.njchy.statistics.config;

import org.springframework.core.convert.converter.Converter;
import java.lang.reflect.Constructor;
import java.util.concurrent.RejectedExecutionHandler;

/**
 * 自定义转换器：字符串（全类名）→ RejectedExecutionHandler实例
 */
public class RejectedExecutionHandlerConverter implements Converter<String, RejectedExecutionHandler> {

    @Override
    public RejectedExecutionHandler convert(String className) {
        try {
            // 1. 处理内部类（如 ThreadPoolExecutor$CallerRunsPolicy）
            Class<?> handlerClass;
            if (className.contains("$")) {
                // 分割外部类和内部类全类名
                String outerClassName = className.substring(0, className.indexOf("$"));
                String innerClassName = className.substring(className.indexOf("$") + 1);
                // 加载外部类，再通过外部类加载内部类（关键：内部类必须通过外部类获取）
                Class<?> outerClass = Class.forName(outerClassName);
                handlerClass = Class.forName(outerClassName + "$" + innerClassName, true, outerClass.getClassLoader());
            } else {
                // 非内部类：直接加载
                handlerClass = Class.forName(className);
            }

            // 2. 校验是否实现 RejectedExecutionHandler 接口
            if (!RejectedExecutionHandler.class.isAssignableFrom(handlerClass)) {
                throw new IllegalArgumentException("类[" + className + "]未实现 RejectedExecutionHandler 接口");
            }

            // 3. 反射创建实例（拒绝策略类均有默认无参构造）
            Constructor<?> constructor = handlerClass.getDeclaredConstructor();
            constructor.setAccessible(true); // 允许访问非public构造（防止内部类权限问题）
            return (RejectedExecutionHandler) constructor.newInstance();

        } catch (Exception e) {
            // 抛出明确错误，便于排查配置问题
            throw new RuntimeException("拒绝策略转换失败！请检查全类名是否正确：" + className, e);
        }
    }
}